#include <stdio.h>
#include <stdlib.h>
#include "Liste.h"

void initialiserListe(Liste * l)
{
    l->prem=NULL;
    l->last=NULL;
}

int estVideListe(const Liste * l)
{
    if(l->prem==NULL)
        return 1;
    else
        return 0;
}

unsigned int nbElementsListe(const Liste * l)
{
    int nombreEle =0;
    if(estVideListe(l)==1)
        {
            return 0;
        }
    while (l->prem->suivant != NULL)
    {
        nombreEle = nombreEle + 1;
    }
    return (nombreEle);
}

ElementL iemeElementListe(const Liste * l, unsigned int i)
{
    Cellule * c = l->prem;
    int j;
    for (j=0;j<i-1;j++)
    {

        c=c->suivant;

    }
    return c->info;
}

void modfierIemeElementListe(const Liste * l, unsigned int i, ElementL e)
{
    Cellule * c = l->prem;
    int j;
    for (j=0;j<i-1;j++)
    {

        c=c->suivant;

    }
    c->info = e;
}

Cellule * premiereCelluleListe(const Liste * l)
{
    if(estVideListe(l)==1)
        return NULL;
    else
        return l->prem;
}

Cellule * celluleSuivanteListe(const Cellule *c, const Liste * l)
{
    c=premiereCelluleListe(l);
    return c->suivant;
}

void afficherListeGaucheDroite(const Liste * l)
{

    Cellule * c= l->prem;
    while(c != NULL)
	{
        afficherElementL(c->info);
        c=c->suivant;
	}
}

void afficherListeDroiteGauche(const Liste * l)
{
    Cellule * c = l->last;
    while(c != NULL)
    {
        afficherElementL(c->info);
        c = c->precedent;
    }
}

void ajouterEnTeteListe(ElementL e,Liste * l)
{
    Cellule * c;
    c=(Cellule*)malloc(sizeof(Cellule));
    c->info=e;
    c->suivant = l->prem;
    c->precedent = NULL;
    l->prem = c;
    if(l->last==NULL)
    {
        l->last=c;
    }
    else
    {
        l->prem->precedent = c;
    }
}

void ajouterEnQueueListe(ElementL e, Liste * l)
{
    Cellule * c;
    c=(Cellule*)malloc(sizeof(Cellule));
    c->info = e;
    c->suivant= NULL;
    c->precedent = l->last;
    l->last = c;
    if(l->prem ==NULL)
    {
        l->prem = c;
    }
    else
    {
        l->last->suivant = c;
    }
}

void supprimerTeteListe(Liste * l)
{
    Cellule * c = l->prem;
	l->prem = c->suivant;
	free(c);
}

void viderListe(Liste * l)
{
    while(estVideListe(l) == 0)
	{
		supprimerTeteListe(l);
		viderListe(l);
	}
}


void testamentListe(Liste * l)
{
    viderListe(l);
}


void affecterListe(Liste * l1, const Liste * l2)
{

    Cellule * temp;
    temp = l2->prem;
    l1->prem=temp;
    while(temp->suivant != NULL)
    {
        ajouterEnTeteListe(temp->info,l1);
        temp=temp->suivant;
    }
    free(temp);
}


int rechercherElementListe(ElementL e, const Liste *l)
{
    int occ = 0;
    Liste * listemp;
    initialiserListe(listemp);
    affecterListe(listemp, l);
    if(estEgalElementL(listemp->prem->info,e)== 1)
    {
        supprimerTeteListe(listemp);
        occ=occ+1;
    }
    else
    {
        supprimerTeteListe(listemp);
        occ=occ;
    }

return occ;
}


void insererElementListe(ElementL e, Liste * l, unsigned int position);
/* Preconditions : l initialisee et manipulee uniquement a travers les
   operations du module, 0 <= position <= nbElements(l)
   Postconditions : une copie independante de e est inseree de sorte a
   ce qu'elle occupe la position indiquee dans la liste l (les positions
   etant numerotees a partir de 0).*/
